tetralat.adinata = {};

tetralat.adinata.setAdinato = function(grami, stili) {
	var xx = getelid('xx:' + grami + ':' + stili);
	if (notSet(xx)) { return; }
	xx.style.display = 'inline';
};

tetralat.adinata.clearAdinato = function(grami, stili) {
	tetralat.debug.minima('*** CLEAR (' + grami + ', ' + stili + ') ***');
	var xx = getelid('xx:' + grami + ':' + stili);
	if (notSet(xx)) { return; }
	xx.style.display = 'none';
};

tetralat.adinata.clearOla = function() {
	for (var i = 0; i < tetralat.rank; i++) {
		for (var j = 0; j < tetralat.rank; j++) {
			var xx = getelid('xx:' + i + ':' + j);
			if (notSet(xx)) { continue; }
			xx.style.display = 'none';
		}
	}
};

tetralat.adinata.dixe = function(moving, stoxos) {
	if (isSet(tetralat.adinata.moving) && isSet(tetralat.adinata.stoxos) &&
		(moving == tetralat.adinata.moving) && (stoxos == tetralat.adinata.stoxos)) {
		return;
	}

	tetralat.adinata.moving = moving;
	tetralat.adinata.stoxos = stoxos;

	if (notSet(moving.id)) { return; }
	var mid = moving.id;
	var mxy = mid.split(':');
	if (mxy.length != 3) { return; }

	// Το "mid" είναι της μορφής "t:x:y", αλλά εμείς το παραλλάσσουμε
	// σε αντίστοιχη μορφή "i:x:y" για να μοιάζει με τα ελεγχόμενα.
	mid = 'i:' + mxy[1] + ':' + mxy[2];

	if (notSet(stoxos.id)) { return; }
	var sid = stoxos.id;
	var sxy = sid.split(':');
	if (sxy.length != 3) { return; }

	// Αν ο στόχος είναι στην παλέτα, τότε ακυρώνω τις
	// συντεταγμένες του στόχου.
	if (sxy[0] == 'i') {
		sxy[1] = -1;
		sxy[2] = -1;
	}
	tetralat.debug.ipotitlos('*** DIXE kinito: (' + mxy[1] + ', ' +
		mxy[2] + ') stoxos: (' + sxy[1] + ', ' + sxy[2] + ') ***');

	// Ελέγχω όλα τα εναπομείναντα πλακίδια της παλέτας για να δω αν
	// μπορούν να τοποθετηθούν σε κάποια θέση στο ταμπλό.
	for (var i = 0; i < tetralat.rank; i++) {
		for (var j = 0; j < tetralat.rank; j++) {
			tetralat.adinata.clearAdinato(i, j);

			// Αν ελέγχω αυτό που μετακινώ και ο στόχος
			// δεν είναι στην παλέτα, τότε το αφήνω.
			var id = 'i:' + i + ':' + j;
			if ((id == mid) && (sxy[0] != 'i')) {
				tetralat.debug.minima('*** ΕΙΝΑΙ ΤΟ ΚΙΝΟΥΜΕΝΟ ***', '1.0cm');
				continue;
			}

			// Προσπελαύνω το τετράγωνο και ελέγχω αν έχει
			// ήδη τοποθετηθεί οπότε το αφήνω.
			var p = getelid(id);
			if (notSet(p)) { continue; }
			if (isSet(p.tetralat.sxetiko)) {
				tetralat.debug.minima('*** ΕΧΕΙ ΤΟΠΟΘΕΤΗΘΕΙ ***', '1.0cm');
				continue;
			}

			// Το τετράγωνο "mid" πάει να καταλάβει τη θέση "sid" και
			// ελέγχουμε το τετράγωνο (i, j).
			if (tetralat.adinata.adiexodo(i, j, mxy[1], mxy[2], sxy[1], sxy[2])) {
				tetralat.adinata.setAdinato(i, j);
			}
		}
	}
};

tetralat.adinata.dixeOla = function() {
	for (var i = 0; i < tetralat.rank; i++) {
		for (var j = 0; j < tetralat.rank; j++) {
			tetralat.adinata.clearAdinato(i, j);
			var id = 'i:' + i + ':' + j;
			var p = getelid(id);
			if (notSet(p)) { continue; }

			if (isSet(p.tetralat.sxetiko)) {
				tetralat.debug.minima('*** ΕΧΕΙ ΤΟΠΟΘΕΤΗΘΕΙ ***', '1.0cm');
				continue;
			}

			if (tetralat.adinata.adiexodo(i, j, -1, -1, -1, -1)) {
				tetralat.adinata.setAdinato(i, j);
			}
		}
	}
};

tetralat.adinata.adiexodo = function(grami, stili, gramiKinitou, stiliKinitou, gramiStoxou, stiliStoxou) {
	tetralat.debug.minima('*** ΕΛΕΓΧΕΤΑΙ (' + grami + ', ' + stili + ') ***', '1.0cm');
	for (var i = 0; i < tetralat.rank; i++) {
		for (var j = 0; j < tetralat.rank; j++) {
			tetralat.debug.minima('*** ΘΕΣΗ (' + i + ', ' + j + ') ***', '2.0cm');
			var id = 'o:' + i + ':' + j;
			var p = getelid(id);
			if (notSet(p)) { continue; }

			// Αν είναι κατειλημμένο, το αφήνουμε.
			if (isSet(p.tetralat.sxetiko)) {
				tetralat.debug.minima('*** ΚΑΤΕΙΛΗΜΜΕΝΟ ***', '2.0cm');
				continue;
			}

			// Αν είναι η θέση στην οποία πάμε να τοποθετήσουμε
			// το κινούμενο, το αφήνουμε.
			if ((i == gramiStoxou) && (j == stiliStoxou)) {
				tetralat.debug.minima('*** ΚΑΤΕΙΛΗΜΜΕΝΟ (ΣΤΟΧΟΣ) ***', '2.0cm');
				continue;
			}

			if (tetralat.adinata.kakiGrami(i, grami, stili, gramiKinitou, stiliKinitou,
				gramiStoxou, stiliStoxou)) {
				continue;
			}

			if (tetralat.adinata.kakiStili(j, grami, stili, gramiKinitou, stiliKinitou,
				gramiStoxou, stiliStoxou)) {
				continue;
			}
			return false;
		}
	}
	return true;
};

tetralat.adinata.kakiGrami = function(i, grami, stili, gramiKinitou, stiliKinitou, gramiStoxou, stiliStoxou) {
	tetralat.debug.minima('ΕΛΕΓΧΕΤΑΙ ΓΡΑΜΜΗ: ' + i + ' (' + grami + ', ' + stili + ')', '2.0cm');
	for (var j = 0; j < tetralat.rank; j++) {
		if ((i == gramiStoxou) && (j == stiliStoxou)) {
			var gramiMesa = gramiKinitou;
			var stiliMesa = stiliKinitou;
		}
		else {
			var p = getelid('o:' + i + ':' + j);
			if (notSet(p)) { continue; }
			if (notSet(p.tetralat.sxetiko)) { continue; }

			var xy = p.tetralat.sxetiko.id.split(':');
			if (xy.length != 3) { continue; }

			gramiMesa = xy[1];
			stiliMesa = xy[2];
		}
		tetralat.debug.minima('ΕΛΕΓΧΕΤΑΙ KOYTI: (' + i + ', ' + j + ') (' +
			gramiMesa + ', ' + stiliMesa + ')');
		if ((grami == gramiMesa) || (stili == stiliMesa)) {
			tetralat.debug.minima('ΑΚΑΤΑΛΛΗΛΗ ΓΡΑΜΜΗ: ' + i + ' (' +
				grami + ', ' + stili + ')', '2.0cm');
			return true;
		}
	}
	return false;
};

tetralat.adinata.kakiStili = function(j, grami, stili, gramiKinitou, stiliKinitou, gramiStoxou, stiliStoxou) {
	tetralat.debug.minima('ΕΛΕΓΧΕΤΑΙ ΣΤΗΛΗ: ' + j + ' (' + grami + ', ' + stili + ')', '2.0cm');
	for (var i = 0; i < tetralat.rank; i++) {
		if ((i == gramiStoxou) && (j == stiliStoxou)) {
			var gramiMesa = gramiKinitou;
			var stiliMesa = stiliKinitou;
		}
		else {
			var p = getelid('o:' + i + ':' + j);
			if (notSet(p)) { continue; }
			if (notSet(p.tetralat.sxetiko)) { continue; }

			var xy = p.tetralat.sxetiko.id.split(':');
			if (xy.length != 3) { continue; }
				tetralat.debug.minima('***ΕΛΕΓΧΕΤΑΙ KOYTI: (' + i + ', ' +
					j + ') (' + p.tetralat.sxetiko.id + ')');

			gramiMesa = xy[1];
			stiliMesa = xy[2];
		}
		tetralat.debug.minima('ΕΛΕΓΧΕΤΑΙ KOYTI: (' + i + ', ' + j + ') (' +
			gramiMesa + ', ' + stiliMesa + ')');
		if ((grami == gramiMesa) || (stili == stiliMesa)) {
			tetralat.debug.minima('ΑΚΑΤΑΛΛΗΛΗ ΣΤΗΛΗ: ' + i + ' (' +
				grami + ', ' + stili + ')', '2.0cm');
			return true;
		}
	}
	return false;
};
